﻿<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:XmlExplorer"
    xmlns:xpath="clr-namespace:System.Xml.XPath;assembly=System.Xml">

    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />

    <local:InvertedBooleanToVisibilityConverter x:Key="invertedBooleanToVisibilityConverter" />

    <local:XPathNodeTypeDataTemplateSelector x:Key="xPathNodeTypeDataTemplateSelector" />

    <local:XPathNavigatorItemsConverter x:Key="xPathNavigatorItemsConverter" />

    <local:XPathNavigatorAttributesConverter x:Key="xPathNavigatorAttributesConverter" />

    <SolidColorBrush x:Key="GlyphBrush" Color="#444" />

    <Style x:Key="xmlDelimiterStyle" TargetType="TextBlock">
        <Setter Property="Foreground" Value="Blue" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}},Path=IsSelected}" Value="True">
                <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                <Setter Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
            </DataTrigger>

            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}},Path=IsSelected}" Value="True" />
                    <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}},Path=IsSelectionActive}" Value="false"/>
                </MultiDataTrigger.Conditions>
                <Setter Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
            </MultiDataTrigger>

            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type TreeViewItem}},Path=IsEnabled}" Value="False">
                <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>

    <Style x:Key="xmlAttributeValueStyle" TargetType="TextBlock" BasedOn="{StaticResource xmlDelimiterStyle}">
        <Setter Property="Foreground" Value="Blue" />
    </Style>

    <Style x:Key="xmlAttributeNameStyle" TargetType="TextBlock" BasedOn="{StaticResource xmlDelimiterStyle}">
        <Setter Property="Foreground" Value="Red" />
    </Style>

    <Style x:Key="xmlNameStyle" TargetType="TextBlock" BasedOn="{StaticResource xmlDelimiterStyle}">
        <Setter Property="Foreground" Value="DarkRed" />
    </Style>

    <Style x:Key="xmlTextStyle" TargetType="TextBlock" BasedOn="{StaticResource xmlDelimiterStyle}">
        <Setter Property="Foreground" Value="DarkRed" />
    </Style>

    <Style x:Key="xmlCommentStyle" TargetType="TextBlock" BasedOn="{StaticResource xmlDelimiterStyle}">
        <Setter Property="Foreground" Value="Green" />
    </Style>

    <Style x:Key="xmlProcessingInstructionStyle" TargetType="TextBlock" BasedOn="{StaticResource xmlDelimiterStyle}">
        <Setter Property="Foreground" Value="Gray" />
    </Style>

    <Style x:Key="ExpandCollapseToggleStyle" TargetType="ToggleButton">
        <Setter Property="Focusable" Value="False"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ToggleButton">
                    <Grid
          Width="15"
          Height="13"
          Background="Transparent">
                        <Path x:Name="ExpandPath"
            HorizontalAlignment="Left"
            VerticalAlignment="Center"
            Margin="1,1,1,1"
            Fill="{StaticResource GlyphBrush}"
            Data="M 4 0 L 8 4 L 4 8 Z"/>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked"
               Value="True">
                            <Setter Property="Data"
                TargetName="ExpandPath"
                Value="M 0 4 L 8 4 L 4 8 Z"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="TreeViewItemFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border>
                        <Rectangle Margin="0,0,0,0"
                 StrokeThickness="5"
                 Stroke="Black"
                 StrokeDashArray="1 2"
                 Opacity="0"/>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="{x:Type TreeViewItem}"
     TargetType="{x:Type TreeViewItem}">
        <Setter Property="local:TreeViewItemBehavior.IsBroughtIntoViewWhenSelected" Value="True" />
        <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
        <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        <Setter Property="Background"
      Value="Transparent"/>
        <Setter Property="HorizontalContentAlignment"
      Value="{Binding Path=HorizontalContentAlignment,
              RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="VerticalContentAlignment"
      Value="{Binding Path=VerticalContentAlignment,
              RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
        <Setter Property="Padding"
      Value="1,0,0,0"/>
        <Setter Property="Foreground"
      Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="FocusVisualStyle"
      Value="{StaticResource TreeViewItemFocusVisual}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TreeViewItem}">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition MinWidth="19"
                      Width="Auto"/>
                            <ColumnDefinition Width="Auto"/>
                            <ColumnDefinition Width="*"/>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <ToggleButton x:Name="Expander"
                  Style="{StaticResource ExpandCollapseToggleStyle}"
                  IsChecked="{Binding Path=IsExpanded,
                              RelativeSource={RelativeSource TemplatedParent}}"
                  ClickMode="Press"/>
                        <Border Name="Bd"
              Grid.Column="1"
              Background="{TemplateBinding Background}"
              BorderBrush="{TemplateBinding BorderBrush}"
              BorderThickness="{TemplateBinding BorderThickness}"
              Padding="{TemplateBinding Padding}">
                            <ContentPresenter x:Name="PART_Header"
                      ContentSource="Header"
                      HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"/>
                        </Border>
                        <ItemsPresenter x:Name="ItemsHost"
                  Grid.Row="1"
                  Grid.Column="1"
                  Grid.ColumnSpan="2"/>
                        <Border x:Name="EndTag" Grid.Row="2" Grid.Column="1"
                            Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Padding="{TemplateBinding Padding}" >
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Style="{StaticResource xmlDelimiterStyle}" Text="&lt;/" />
                                <TextBlock Style="{StaticResource xmlNameStyle}" Text="{Binding Name}" />
                                <TextBlock Style="{StaticResource xmlDelimiterStyle}" Text="&gt;" />
                            </StackPanel>
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsExpanded"
                            Value="false">
                            <Setter TargetName="ItemsHost"
                                Property="Visibility"
                                Value="Collapsed"/>
                            <Setter TargetName="EndTag"
                                Property="Visibility"
                                Value="Collapsed"/>
                        </Trigger>
                        <Trigger Property="HasItems"
                            Value="false">
                            <Setter TargetName="Expander"
                                Property="Visibility"
                                Value="Hidden"/>
                            <Setter TargetName="EndTag"
                                Property="Visibility"
                                Value="Collapsed"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="HasHeader"
                                    Value="false"/>
                                <Condition Property="Width"
                                    Value="Auto"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_Header"
                                Property="MinWidth"
                                Value="75"/>
                        </MultiTrigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="HasHeader"
                                    Value="false"/>
                                <Condition Property="Height"
                                    Value="Auto"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="PART_Header"
                                Property="MinHeight"
                                Value="19"/>
                        </MultiTrigger>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="Bd"
                                Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter TargetName="EndTag"
                                Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                            <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
                        </Trigger>
                        <MultiTrigger>
                            <MultiTrigger.Conditions>
                                <Condition Property="IsSelected" Value="true"/>
                                <Condition Property="IsSelectionActive" Value="false"/>
                            </MultiTrigger.Conditions>
                            <Setter TargetName="Bd" Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            <Setter TargetName="EndTag" Property="Background"
                                Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                            <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
                        </MultiTrigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground"
                                Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <HierarchicalDataTemplate x:Key="elementXPathNavigatorTemplate"
                                  ItemsSource="{Binding Children}"
                                  ItemTemplateSelector="{StaticResource xPathNodeTypeDataTemplateSelector}">
        <StackPanel Orientation="Horizontal">
            <TextBlock Style="{StaticResource xmlDelimiterStyle}" Text="&lt;" />
            <TextBlock Style="{StaticResource xmlNameStyle}" Text="{Binding Name}" />
            <TextBlock Text=" " />
            <TextBlock Style="{StaticResource xmlAttributeNameStyle}" Text="xmlns:" Visibility="{Binding HasNamespace, Converter={StaticResource booleanToVisibilityConverter}}" />
            <TextBlock Style="{StaticResource xmlAttributeNameStyle}" Text="{Binding XPathNavigator.Prefix}" Visibility="{Binding HasNamespace, Converter={StaticResource booleanToVisibilityConverter}}" />
            <TextBlock Style="{StaticResource xmlDelimiterStyle}" Visibility="{Binding HasNamespace, Converter={StaticResource booleanToVisibilityConverter}}">="</TextBlock>
            <TextBlock Style="{StaticResource xmlAttributeValueStyle}" Text="{Binding XPathNavigator.NamespaceURI}" Visibility="{Binding HasNamespace, Converter={StaticResource booleanToVisibilityConverter}}"/>
            <TextBlock Style="{StaticResource xmlDelimiterStyle}" Text="&quot; " Visibility="{Binding HasNamespace, Converter={StaticResource booleanToVisibilityConverter}}" />
            <ItemsControl ItemsSource="{Binding Converter={StaticResource xPathNavigatorAttributesConverter}}"
						  KeyboardNavigation.IsTabStop="False">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" />
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" KeyboardNavigation.IsTabStop="False" >
                            <TextBlock Style="{StaticResource xmlAttributeNameStyle}" Text="{Binding Name}" />
                            <TextBlock Style="{StaticResource xmlDelimiterStyle}">="</TextBlock>
                            <TextBlock Style="{StaticResource xmlAttributeValueStyle}" Text="{Binding Value}" />
                            <TextBlock Style="{StaticResource xmlDelimiterStyle}" Text="&quot; " />
                        </StackPanel>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
            <TextBlock
					Text="/"
					Style="{StaticResource xmlDelimiterStyle}"
					Visibility="{Binding XPathNavigator.HasChildren, Converter={StaticResource invertedBooleanToVisibilityConverter}}" />
            <TextBlock Style="{StaticResource xmlDelimiterStyle}" Text="&gt;" />
        </StackPanel>
    </HierarchicalDataTemplate>

    <DataTemplate x:Key="textXPathNavigatorTemplate">
        <TextBlock Style="{StaticResource xmlTextStyle}" Text="{Binding Value}" />
    </DataTemplate>

    <DataTemplate x:Key="attributeXPathNavigatorTemplate">
        <TextBlock Style="{StaticResource xmlAttributeValueStyle}" Text="{Binding Value}" />
    </DataTemplate>

    <DataTemplate x:Key="commentXPathNavigatorTemplate">
        <TextBlock Style="{StaticResource xmlCommentStyle}">
			<![CDATA[<!--]]>
			<TextBlock Style="{StaticResource xmlCommentStyle}" Text="{Binding Value}" />
			<![CDATA[-->]]>
		</TextBlock>
    </DataTemplate>

    <DataTemplate x:Key="xmlDeclarationXPathNavigatorTemplate">
        <TextBlock Style="{StaticResource xmlDelimiterStyle}">
			&lt;?
			<TextBlock Style="{StaticResource xmlNameStyle}" Text="{Binding Name}" />
			<TextBlock Style="{StaticResource xmlProcessingInstructionStyle}" Text="{Binding Value}" />
			?&gt;
		</TextBlock>
    </DataTemplate>

    <DataTemplate x:Key="processingInstructionXPathNavigatorTemplate">
        <TextBlock Style="{StaticResource xmlDelimiterStyle}">
			&lt;?
			<TextBlock Style="{StaticResource xmlNameStyle}" Text="{Binding Name}" />
			<TextBlock Style="{StaticResource xmlProcessingInstructionStyle}" Text="{Binding Value}" />
			?&gt;
		</TextBlock>
    </DataTemplate>

</ResourceDictionary>